
 <!DOCTYPE HTML>
<html >
<head>
  <meta charset="UTF-8">
  
    <title>mysql学习笔记（二） | 刘宇帅的博客</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3, minimum-scale=1">
    
    <meta name="author" content="刘宇帅">
    
    <meta name="description" content="选择优化的数据类型MySQL支持的数据类型非常多，选择正确的数据类型对于获得高性能至关重要。下面有几个数据类型选择的原则

更小的通常更好：尽量选择可以正确存储数据的最小数据类型。更小的暂用空间，消耗资源更少。
简单就好：简单的数据类型通常需要更少的cpu周期。例如可以使用整数存储的就不要使用字符串">
    
    
    
  <meta name="baidu_union_verify" content="fe6759a0a7e8d8e36d21c939b917ccb0">
    
    
    <link rel="icon" href="/img/favicon.ico">
    
    
    <link rel="apple-touch-icon" href="/img/author.png">
    <link rel="apple-touch-icon-precomposed" href="/img/author.png">
    
    <link rel="stylesheet" href="/css/style.css">
</head>

  <body>
    <header>
      <div>
		
			<div id="imglogo">
				<a href="/"><img src="/img/author.png" alt="刘宇帅的博客" title="刘宇帅的博客"/></a>
			</div>
			
			<div id="textlogo">
				<h1 class="site-name"><a href="/" title="刘宇帅的博客">刘宇帅的博客</a></h1>
				<h2 class="blog-motto">记录程序学习之路</h2>
			</div>
			<div class="navbar"><a class="navbutton navmobile" href="#" title="Menu">
			</a></div>
			<nav class="animated">
				<ul>
					
						<li><a href="/">Home</a></li>
					
						<li><a href="/archives">Archives</a></li>
					
						<li><a href="/about">About</a></li>
					
					<li>
					
					<form class="search" action="//google.com/search" method="get" accept-charset="utf-8">
						<label>Search</label>
						<input type="text" id="search" name="q" autocomplete="off" maxlength="20" placeholder="Search" />
						<input type="hidden" name="q" value="site:hexo.liuyushuai.com">
					</form>
					
					</li>
				</ul>
			</nav>			
</div>

    </header>
    <div id="container">
      <div id="main" class="post" itemscope itemprop="blogPost">
	<article itemprop="articleBody"> 
		<header class="article-info clearfix">
  <h1 itemprop="name">
    
      <a href="/2017/02/11/mysql/mysql学习笔记（二）/" title="mysql学习笔记（二）" itemprop="url">mysql学习笔记（二）</a>
  </h1>
  <p class="article-author">By
    
      <a href="http://hexo.liuyushuai.com" title="刘宇帅">刘宇帅</a>
    
      <span id="busuanzi_container_page_pv">
  本文总阅读量<span id="busuanzi_value_page_pv"></span>次
</span>
  </p>
  <p class="article-time">
    <time datetime="2017-02-11T15:55:11.000Z" itemprop="datePublished">2017-02-11</time>
    Updated:<time datetime="2017-02-13T08:27:16.000Z" itemprop="dateModified">2017-02-13</time>
    
  </p>
</header>
	<div class="article-content">
		
		
		<div id="toc" class="toc-article">
			<strong class="toc-title">Contents</strong>
		<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#选择优化的数据类型"><span class="toc-number">1.</span> <span class="toc-text">选择优化的数据类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#整数类型"><span class="toc-number">2.</span> <span class="toc-text">整数类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#实数类型"><span class="toc-number">3.</span> <span class="toc-text">实数类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#字符串类型"><span class="toc-number">4.</span> <span class="toc-text">字符串类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#日期和时间"><span class="toc-number">5.</span> <span class="toc-text">日期和时间</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#位数据类型"><span class="toc-number">6.</span> <span class="toc-text">位数据类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#标识符选择"><span class="toc-number">7.</span> <span class="toc-text">标识符选择</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#特殊数据类型"><span class="toc-number">8.</span> <span class="toc-text">特殊数据类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#MySQL-schema设计中的陷阱"><span class="toc-number">9.</span> <span class="toc-text">MySQL schema设计中的陷阱</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#缓存表和汇总表"><span class="toc-number">10.</span> <span class="toc-text">缓存表和汇总表</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#物化视图表"><span class="toc-number">10.1.</span> <span class="toc-text">物化视图表</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#计数器表"><span class="toc-number">10.2.</span> <span class="toc-text">计数器表</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#加快alter-table的速度"><span class="toc-number">11.</span> <span class="toc-text">加快alter table的速度</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#只修改-frm文件"><span class="toc-number">11.1.</span> <span class="toc-text">只修改.frm文件</span></a></li></ol></li></ol>
		</div>
		
		<h2 id="选择优化的数据类型"><a href="#选择优化的数据类型" class="headerlink" title="选择优化的数据类型"></a>选择优化的数据类型</h2><p>MySQL支持的数据类型非常多，选择正确的数据类型对于获得高性能至关重要。<br>下面有几个数据类型选择的原则</p>
<ul>
<li>更小的通常更好：尽量选择可以正确存储数据的最小数据类型。更小的暂用空间，消耗资源更少。</li>
<li>简单就好：简单的数据类型通常需要更少的cpu周期。例如可以使用整数存储的就不要使用字符串了。</li>
<li>尽量避免NULL：大部分设计的时候通常会跟列添加默认值null。列值为null的，在mysql建立索引，索引统计，值比较更加复杂。</li>
</ul>
<h2 id="整数类型"><a href="#整数类型" class="headerlink" title="整数类型"></a>整数类型</h2><p>整数类型：tinyint、smallinit、mediumint、int、bigint,<br>分别使用8,16,24,32,64位的存储空间。他们存储的值范围是$-2^(n-2)$<br>到$2^(n-1)-1$。可以设置unsigned设置存储为不存储负数，则整数存储范围加倍。<br>但是两者的性能是一致的。</p>
<blockquote>
<p>tips：mysql可以为整数类型指定宽度。例：int(11),int(1)。对大多数应用是无用的，两者的效果一样。只是<br>对一部分交互工具展示的字符个数有作用。</p>
</blockquote>
<h2 id="实数类型"><a href="#实数类型" class="headerlink" title="实数类型"></a>实数类型</h2><p>不精确类型：float,double<br>精确类型：decimal</p>
<h2 id="字符串类型"><a href="#字符串类型" class="headerlink" title="字符串类型"></a>字符串类型</h2><ol>
<li>varchar： 用于存储可边长字符串。比定长类型节省空间，该类型只占用必要的空间。<br>varchar需要一个或两个额外的字节记录字符串的长度。如果列长度小于等于255则只需要一个字节，<br>或则需要两个字节。使用场景：最大长度比平均长度长很多，变化较少。</li>
<li><p>char：char类型是定长的，mysql根据定义长度分配足够的空间。char类型适合存储长度<br>接近同一个值的字段类型。</p>
<blockquote>
<p>mysql储存char类型的时候会删除字符串末尾的空格。</p>
</blockquote>
</li>
<li><p>blob和text：为了存储很大的的数据而设计的字符串类型。<br>包括：tinytext,smalltext,text,mediumtext,longtext和tinyblog,smallblob,<br>blob,longblob。其中smalltext跟text一样，blob和smallblob一样。</p>
</li>
<li><p>使用枚举类型代替字符串</p>
</li>
</ol>
<p>某列的可取值是有限的情况下，可以使用枚举类型。</p>
<pre><code>mysql&gt; create table enum_test(
    -&gt; e enum(&#39;fish&#39;, &#39;apple&#39;, &#39;dog&#39;) not null
    -&gt;);
</code></pre><p>每行存储的实际上是整数，排序的话也是按整数排序。</p>
<h2 id="日期和时间"><a href="#日期和时间" class="headerlink" title="日期和时间"></a>日期和时间</h2><p>datetime：这个类型保存的范围是1001-9999，精度为秒。<br>timestamp：保存1970-2038之间的时间值。timestamp的值受时区的影响。<br>timestamp不赋值时，系统会赋值为当前值。一般使用timestamp，比datetime效率高。</p>
<h2 id="位数据类型"><a href="#位数据类型" class="headerlink" title="位数据类型"></a>位数据类型</h2><p>MySQL有少数几种存储类型使用位存储数据，这些不管地秤的存储格式和处理方式如何，从技术上来讲都是字符串类型。</p>
<ul>
<li>bit:可以使用bit类型存储一个或多个true/false值。bit(1)定义一个包含单个位的字段，以此类推。bit最大包含64个位。<br>Mysql把bit当做字符串类型，但检索到bit(1)结果是一个包含二进制0或1的字符串，而不是ASCII码’0’或’1’。<br>然而在数字的上下文中，结果将是位字符串转换成数字。<br>例如：<pre><code>mysql&gt; create table bittest(abit(8));
mysql&gt; insert into bittest values(b&#39;0111001&#39;);
mysql&gt; select a, a+0 from bittest;
</code></pre></li>
</ul>
<p>result:<br>| a | a+0 |<br>| - | - |<br>| 9 | 57 |</p>
<p>这样很容易让人费解或出错，所以尽量不要使用该类型。可以用char(0)或tinyint代替。</p>
<ul>
<li>set:如果保存很多true/false值，可以考虑合并这些列到一个set数据类型，它在mysql内部是以一系列打包的位的集合表示的。<br>这样有效利用了空间，并且mysql里有find_in_set()和field()这样的函数。方便在查询中使用。缺点是在添加一个新的值时，alter table代价比较高。</li>
</ul>
<blockquote>
<p>tips:在需要使用该类型数据时，可以使用int型来代替，例如tinyint表示八种true/false。相关逻辑实现可在自己代码里实现。</p>
</blockquote>
<h2 id="标识符选择"><a href="#标识符选择" class="headerlink" title="标识符选择"></a>标识符选择</h2><p>标识符选择注意项：</p>
<ol>
<li>标识符和其在其他表里作为外键的定义要完全一致。例如：int型的unsigned也要一致。因为这些字段有可能<br>会在查询中做比较，类型不一致可能会造成性能问题或难以发现的错误。</li>
<li>在可以满足值的范围的条件下并且预留未来增长的空间时，应该选择最小的数据类型。</li>
<li>整数类型通常是标识符的最佳选择，因为他们很快并可以用auto_increment。</li>
<li>尽量避免使用string类型，因为他们消耗空间且比整数类型慢。</li>
</ol>
<blockquote>
<p>tips: 字符串的随机性比较大，插入值会写到索引的不同位置，insert会很慢，会导致页分裂，<br>磁盘随机访问，以及对于聚簇索引产生聚簇索引碎片。同样select也会很慢，因为逻辑上相同的行<br>可能分布在不同磁盘空间。</p>
</blockquote>
<h2 id="特殊数据类型"><a href="#特殊数据类型" class="headerlink" title="特殊数据类型"></a>特殊数据类型</h2><p>某些类型的数据不直接和内置类型一致。低于秒级精度的时间戳（使用bitint存储时间戳，或float类型小数部分存储秒以后的数值）就是一个例子。</p>
<p>IPv4一本会本人存储为varchar(15)。但是实际上ip是32位无符号的整数。mysql的存储方式是存储为int型。<br>mysql并提供inet_aton() 和 inet_ntoa()函数在两者之间转换。</p>
<h2 id="MySQL-schema设计中的陷阱"><a href="#MySQL-schema设计中的陷阱" class="headerlink" title="MySQL schema设计中的陷阱"></a>MySQL schema设计中的陷阱</h2><ul>
<li><p>太多的列：MySQL的存储引擎API工作时需要在服务器和存储引擎之间通过行缓存格式拷贝数据，然后在服务器层将缓存解码成各个列。<br>从行缓冲将编码过的列转换成行数据结构代价非常高。MyISAM的定长行结构实际上和服务器层的行结构正好匹配不需要转换。然而MyISAM的边长行和InnoDB的行结构总是需要转换。</p>
</li>
<li><p>太多的关联：MySQL限制了每个关联操作最多只能有61个表。如果希望查询执行的快速并且并发性好，<br>单个查询最好控制在12个关联表以内。</p>
</li>
<li><p>全能的枚举：防止过分使用枚举，例如：</p>
<pre><code>mysql&gt; create table test(
mysq &gt; country enu(&#39;&#39;,&#39;0&#39;,&#39;1&#39;,&#39;2&#39;……&#39;31&#39;));
</code></pre><p>这样就太过复杂了。</p>
</li>
</ul>
<h2 id="缓存表和汇总表"><a href="#缓存表和汇总表" class="headerlink" title="缓存表和汇总表"></a>缓存表和汇总表</h2><p>有时候提升mysql的性能的办法是在一张表里保存衍生的冗余数据。有时候也需要创建独立的缓存表或汇总表。</p>
<ol>
<li><p>缓存表：有时候可能需要各种不同的索引组合去查询数据，数据来源也可能不是单一表，这个时候就需要创建包含仅需要的列的一个独立表。<br>混存表可以使用不同的存储引擎（例如：利用MyISAM来支持全文索引）,或则使用专门的检索服务例如solr,lucene等。</p>
</li>
<li><p>汇总表：汇总表一般用来保存group得到的结果（例如：当前所有的聊天消息数量等）。这类可以每小时统计以下前一个小时数据表里（保存所有数据的列表）的数量，并把每小时的数量保存在一个单独表即汇总表，这样当查询当前一共有多少消息时，只需要根据汇总表里查出当前小时以前的所有数量，再查当前小时在数据表里的数量相加即可。</p>
</li>
</ol>
<blockquote>
<p>统计某商品收藏人数实现：该数据的实时性要求并不高，可以根据商品id在redis里记录收藏数量及收藏id，定时去查询收藏表，并把大于该收藏id的收藏条数加到redis里维护的值上，修改当前收藏id即可。</p>
</blockquote>
<h3 id="物化视图表"><a href="#物化视图表" class="headerlink" title="物化视图表"></a>物化视图表</h3><p>许多数据库实现了物化视图表，该表是计算当前磁盘上所有信息得到的表，并根据各种策略（日志记录等）去更新。物化视图跟缓存表和汇总表相比，物化视图提取表的原始修改，不再去查表统计，所以性能更好。<br>mysql虽然没有实现物化视图，但是可以通过开源工具flexviews等来实现。</p>
<h3 id="计数器表"><a href="#计数器表" class="headerlink" title="计数器表"></a>计数器表</h3><p>前面统计商品的数量是使用redis实现的，并不实时，可以使用如下方式增加实时和并发。</p>
<p>在表里存储10行，slot=1、slot=2、……slot=10。每次更新的时候随机更新某一行。</p>
<pre><code>mysql&gt; update num_table set count=count+1 where slot=rand()*10;
</code></pre><p>统计总数量：</p>
<pre><code>mysql&gt; select sum(count) from num_table;
</code></pre><h2 id="加快alter-table的速度"><a href="#加快alter-table的速度" class="headerlink" title="加快alter table的速度"></a>加快alter table的速度</h2><p>mysql的alter table操作对于大表而言是个大问题。mysql大部分修改表结构的方式是：创建相同结构的新表，把老表数据倒入新表，删除老表。该过程对内存，索引大小的依赖很大。该过程时间会很长，甚至数天时间，而且期间会锁表，但是服务中断，所以要谨慎操作。</p>
<h3 id="只修改-frm文件"><a href="#只修改-frm文件" class="headerlink" title="只修改.frm文件"></a>只修改.frm文件</h3><p><strong>该方式非官方支持，谨慎使用</strong><br>可使用的修改类型：</p>
<ul>
<li>移除一个列的的auto_increment属性</li>
<li>增加、移除、更改 enum和set常量<br>一共四步：</li>
</ul>
<ol>
<li>创建一个相同结构的空表，并对空表进行想用的修改（例如删除id的自增：alter table test_table modify column id int)</li>
<li>执行flush tables with read lock.这将关闭所有正在使用表，并禁止任何表被打开。</li>
<li>交换两个表的.frm文件</li>
<li>执行 unlock tables解除步骤2的锁定</li>
</ol>
  
	</div>
		<footer class="article-footer clearfix">

  <div class="article-tags">
  
  <span></span> <a href="/tags/mysql/">mysql</a>
  </div>


<div class="article-categories">
  <span></span>
  <a class="article-category-link" href="/categories/mysql/">mysql</a>
</div>



<div class="article-share" id="share">

  <div data-url="http://hexo.liuyushuai.com/2017/02/11/mysql/mysql学习笔记（二）/" data-title="mysql学习笔记（二） | 刘宇帅的博客" data-tsina="null" class="share clearfix">
  </div>

</div>
</footer>   	       
	</article>
	
<nav class="article-nav clearfix">
 
 <div class="prev" >
 <a href="/2017/02/14/B-tree/" title="B-tree">
  <strong>PREVIOUS:</strong><br/>
  <span>
  B-tree</span>
</a>
</div>


<div class="next">
<a href="/2017/02/11/mysql/mysql常用语句/"  title="mysql常用语句">
 <strong>NEXT:</strong><br/> 
 <span>mysql常用语句
</span>
</a>
</div>

</nav>

	
<section class="comment">
	<div class="ds-thread"></div>
</section>

</div>  
      <div class="openaside"><a class="navbutton" href="#" title="Show Sidebar"></a></div>

  <div id="toc" class="toc-aside">
  <strong class="toc-title">Contents</strong>
  <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#选择优化的数据类型"><span class="toc-number">1.</span> <span class="toc-text">选择优化的数据类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#整数类型"><span class="toc-number">2.</span> <span class="toc-text">整数类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#实数类型"><span class="toc-number">3.</span> <span class="toc-text">实数类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#字符串类型"><span class="toc-number">4.</span> <span class="toc-text">字符串类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#日期和时间"><span class="toc-number">5.</span> <span class="toc-text">日期和时间</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#位数据类型"><span class="toc-number">6.</span> <span class="toc-text">位数据类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#标识符选择"><span class="toc-number">7.</span> <span class="toc-text">标识符选择</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#特殊数据类型"><span class="toc-number">8.</span> <span class="toc-text">特殊数据类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#MySQL-schema设计中的陷阱"><span class="toc-number">9.</span> <span class="toc-text">MySQL schema设计中的陷阱</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#缓存表和汇总表"><span class="toc-number">10.</span> <span class="toc-text">缓存表和汇总表</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#物化视图表"><span class="toc-number">10.1.</span> <span class="toc-text">物化视图表</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#计数器表"><span class="toc-number">10.2.</span> <span class="toc-text">计数器表</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#加快alter-table的速度"><span class="toc-number">11.</span> <span class="toc-text">加快alter table的速度</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#只修改-frm文件"><span class="toc-number">11.1.</span> <span class="toc-text">只修改.frm文件</span></a></li></ol></li></ol>
  </div>

<div id="asidepart">
<div class="closeaside"><a class="closebutton" href="#" title="Hide Sidebar"></a></div>
<aside class="clearfix">

  
<div class="categorieslist">
	<p class="asidetitle">Categories</p>
		<ul>
		
			<li><a href="/categories/mysql/" title="mysql">mysql<sup>8</sup></a></li>
		
			<li><a href="/categories/nginx/" title="nginx">nginx<sup>3</sup></a></li>
		
			<li><a href="/categories/php/" title="php">php<sup>2</sup></a></li>
		
			<li><a href="/categories/生活/" title="生活">生活<sup>1</sup></a></li>
		
		</ul>
</div>


  
  <div class="tagcloudlist">
    <p class="asidetitle">Tag Cloud</p>
    <div class="tagcloudlist clearfix">
       <a href="/tags/ToDoList/" style="font-size: 10px;">ToDoList</a> <a href="/tags/mysql/" style="font-size: 20px;">mysql</a> <a href="/tags/nginx/" style="font-size: 16.67px;">nginx</a> <a href="/tags/php/" style="font-size: 13.33px;">php</a> <a href="/tags/php-调试/" style="font-size: 10px;">php 调试</a> <a href="/tags/分区表/" style="font-size: 10px;">分区表</a> <a href="/tags/北京/" style="font-size: 10px;">北京</a> <a href="/tags/存储引擎/" style="font-size: 13.33px;">存储引擎</a> <a href="/tags/查询优化/" style="font-size: 10px;">查询优化</a> <a href="/tags/索引/" style="font-size: 10px;">索引</a>
    </div>
  </div>


  <div class="linkslist">
  <p class="asidetitle">Links</p>
    <ul>
      <li><a href="http://topjs.org" target="_blank" title="YangJian">topjs</a></li>
      <li><a href="http://hexo.io" target="_blank" title="Hexo">Hexo</a></li>
    </ul>
</div>


</aside>
</div>
    </div>
    <footer><div id="footer" >
	
	<div class="line">
		<span></span>
		<div class="author"></div>
	</div>
	
	
	<div class="social-font clearfix">
		
		
		
		
		
	</div>
		<p class="copyright">Powered by <a href="http://hexo.io" target="_blank" title="hexo">hexo</a> and Theme by <a href="https://github.com/A-limon/pacman" target="_blank" title="Pacman">Pacman</a> © 2017 
		
		<a href="http://hexo.liuyushuai.com" target="_blank" title="刘宇帅">刘宇帅</a>
		
			本站点总访问量：<span id="busuanzi_container_site_pv">
    本站总访问量<span id="busuanzi_value_site_pv"></span>次
</span>
		</p>
	<p style="float: left;width: 100%;text-align: center;color:white"> Copyright ©2015-2017 刘帅,All Rights Reserved <a href="http://www.miitbeian.gov.cn/" style="color: white">豫ICP备16012384号-1</a></p>

</div>
</footer>
    <script src="/js/jquery-2.1.0.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  $('.navbar').click(function(){
    $('header nav').toggleClass('shownav');
  });
  var myWidth = 0;
  function getSize(){
    if( typeof( window.innerWidth ) == 'number' ) {
      myWidth = window.innerWidth;
    } else if( document.documentElement && document.documentElement.clientWidth) {
      myWidth = document.documentElement.clientWidth;
    };
  };
  var m = $('#main'),
      a = $('#asidepart'),
      c = $('.closeaside'),
      o = $('.openaside');
  $(window).resize(function(){
    getSize(); 
    if (myWidth >= 1024) {
      $('header nav').removeClass('shownav');
    }else
    {
      m.removeClass('moveMain');
      a.css('display', 'block').removeClass('fadeOut');
      o.css('display', 'none');
      
      $('#toc.toc-aside').css('display', 'none');
        
    }
  });
  c.click(function(){
    a.addClass('fadeOut').css('display', 'none');
    o.css('display', 'block').addClass('fadeIn');
    m.addClass('moveMain');
  });
  o.click(function(){
    o.css('display', 'none').removeClass('beforeFadeIn');
    a.css('display', 'block').removeClass('fadeOut').addClass('fadeIn');      
    m.removeClass('moveMain');
  });
  $(window).scroll(function(){
    o.css("top",Math.max(80,260-$(this).scrollTop()));
  });
});
</script>

<script type="text/javascript">
$(document).ready(function(){ 
  var ai = $('.article-content>iframe'),
      ae = $('.article-content>embed'),
      t  = $('#toc'),
      h  = $('article h2')
      ah = $('article h2'),
      ta = $('#toc.toc-aside'),
      o  = $('.openaside'),
      c  = $('.closeaside');
  if(ai.length>0){
    ai.wrap('<div class="video-container" />');
  };
  if(ae.length>0){
   ae.wrap('<div class="video-container" />');
  };
  if(ah.length==0){
    t.css('display','none');
  }else{
    c.click(function(){
      ta.css('display', 'block').addClass('fadeIn');
    });
    o.click(function(){
      ta.css('display', 'none');
    });
    $(window).scroll(function(){
      ta.css("top",Math.max(140,320-$(this).scrollTop()));
    });
  };
});
</script>


<script type="text/javascript">
$(document).ready(function(){ 
  var $this = $('.share'),
      url = $this.attr('data-url'),
      encodedUrl = encodeURIComponent(url),
      title = $this.attr('data-title'),
      tsina = $this.attr('data-tsina');
  var html = [
  '<a href="#" class="overlay" id="qrcode"></a>',
  '<div class="qrcode clearfix"><span>扫描二维码分享到微信朋友圈</span><a class="qrclose" href="#share"></a><strong>Loading...Please wait</strong><img id="qrcode-pic" data-src="http://s.jiathis.com/qrcode.php?url=' + encodedUrl + '"/></div>',
  '<a href="#textlogo" class="article-back-to-top" title="Top"></a>',
  '<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="article-share-facebook" target="_blank" title="Facebook"></a>',
  '<a href="#qrcode" class="article-share-qrcode" title="QRcode"></a>',
  '<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="article-share-twitter" target="_blank" title="Twitter"></a>',
  '<a href="http://service.weibo.com/share/share.php?title='+title+'&url='+encodedUrl +'&ralateUid='+ tsina +'&searchPic=true&style=number' +'" class="article-share-weibo" target="_blank" title="Weibo"></a>',
  '<span title="Share to"></span>'
  ].join('');
  $this.append(html);
  $('.article-share-qrcode').click(function(){
    var imgSrc = $('#qrcode-pic').attr('data-src');
    $('#qrcode-pic').attr('src', imgSrc);
    $('#qrcode-pic').load(function(){
        $('.qrcode strong').text(' ');
    });
  });
});     
</script>


<!-- 域名备案关闭评论-->
<!--<script type="text/javascript">-->
  <!--var duoshuoQuery = {short_name:"liuyushuai"};-->
  <!--(function() {-->
    <!--var ds = document.createElement('script');-->
    <!--ds.type = 'text/javascript';ds.async = true;-->
    <!--ds.src = '//static.duoshuo.com/embed.js';-->
    <!--ds.charset = 'UTF-8';-->
    <!--(document.getElementsByTagName('head')[0] -->
    <!--|| document.getElementsByTagName('body')[0]).appendChild(ds);-->
  <!--})();-->
<!--</script> -->



<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  $('.article-content').each(function(i){
    $(this).find('img').each(function(){
      if ($(this).parent().hasClass('fancybox')) return;
      var alt = this.alt;
      if (alt) $(this).after('<span class="caption">' + alt + '</span>');
      $(this).wrap('<a href="' + this.src + '" title="' + alt + '" class="fancybox"></a>');
    });
    $(this).find('.fancybox').each(function(){
      $(this).attr('rel', 'article' + i);
    });
  });
  if($.fancybox){
    $('.fancybox').fancybox();
  }
}); 
</script>



<link rel="stylesheet" href="//cdn.bootcss.com/highlight.js/9.9.0/styles/rainbow.min.css">
<script src="//cdn.bootcss.com/highlight.js/9.9.0/highlight.min.js"></script>
<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
<script type="text/javascript">
    hljs.initHighlightingOnLoad();
</script>

  </body>
</html>
